package com.example.forum.services;

import com.example.forum.model.User;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

/**
 * Created with IntelliJ IDEA.
 * Description: 用户服务层接口
 * User: DELL
 * Date: 2023-09-16
 * Time: 23:16
 */
public interface IUserService {
    /**
     * 创建普通用户
     *
     * @param user 用户必要信息
     */
    void createNormalUser(User user);

    /**
     * 根据用户名查询用户信息
     *
     * @param username 用户名
     * @return 若用户存在: 返回用户详细信息 <br>
     * 若用户不存在: 返回 null
     */
    User selectByUsername(String username);

    /**
     * 登录
     *
     * @param username 用户名
     * @param password 密码
     * @return 登录成功: 用户详细信息 <br>
     * 登录成功: 抛异常
     */
    User login(String username, String password);

    /**
     * 根据用户 id 查询用户信息
     *
     * @param id 用户 id
     * @return 若用户存在: 返回用户详细信息 <br>
     * 若用户不存在: 返回 null
     */
    User selectById(Long id);

    /**
     * 将用户表中的帖子数量加一
     *
     * @param id 用户id
     * @return
     */
    @Transactional
    void addOneArticleCountById(Long id);

    /**
     * 将用户表中的帖子数量减一
     * 当帖子数量为 0 时,将不会更新帖子数量
     *
     * @param id 用户id
     * @return
     */
    @Transactional
    void delOneArticleCountById(Long id);

    /**
     * 修改个⼈信息
     * 此方法在传入的 user 的用户名不为空时,会检验
     * 数据库中是否已经存在要修改的用户名,若存在,则会
     * 抛出异常
     *
     * @param user 要更新的对象
     */
    void update(User user);

    /**
     * 上传头像
     *
     * @param id   用户id
     * @param file 头像
     * @return 投降的保存路径
     */
    public String uploadAvatar(Long id, MultipartFile file);

}
